﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SG.Domain;

namespace SG.Logic
{
    public class ExpVenta:ContextManager
    {
        #region Constructor
        public ExpVenta():base() { 
        
        }
        public ExpVenta(SGEntities cont)
            : base(cont)
        { 
        
        }

        #endregion 
        public IList<Venta> GetAllVenta() {
            return Context.Venta.ToList();
        }
        public void SaveVenta(Venta entity) {

            if (Context.Venta.Count() > 0)
                entity.NroFactura = Context.Venta.Max(f => f.NroFactura) + 1;
            else
                entity.NroFactura = 1;

            foreach (var item in entity.ArticuloVenta)
            {
                Articulo articulo=Context.Articulo.Single(f => f.Id == item.IdArticulo);
                if (item.Cantidad > articulo.Stock)
                    throw new Exception("No hay stock suficiente para el artículo "+articulo.Nombre +". Hay "+articulo.Stock+" unidades." );

                articulo.Stock -= item.Cantidad;
            
                if (articulo.IdPolitica==1 && articulo.Stock < articulo.PuntoPedido && OrdenYaEmitida(articulo)) // Si es politica SQ y el stock es menor al punto de pedido y no hay ya una orden emitida para ese articulo
                {        
                    OrdenCompra oc = new OrdenCompra();
                    DetalleOrdenDeCompra doc = new DetalleOrdenDeCompra();
                    doc.Cantidad = articulo.LoteOptimo;
                    oc.IdProveedor = articulo.ArticuloProveedor.Where(f => f.IdArticulo == articulo.Id).First().IdProveedor;
                    doc.IdArticulo = articulo.Id;
                    oc.Estado = "Generada";
                    oc.DetalleOrdenDeCompra.Add(doc);
                    ExpArticulo exp = new ExpArticulo();
                    exp.SaveOrdenCompra(oc);
                    Context.SaveChanges();
                }

            }

            Context.AddToVenta(entity);            
            Context.SaveChanges();
        }
       
      
        public Venta GetVenta(int id) {
            return Context.Venta.Where(f => f.Id == id).FirstOrDefault();
        }
        
        public void DeleteVenta(int id) {
            Context.DeleteObject(Context.Venta.Where(f => f.Id == id).First());
            Context.SaveChanges();
        
        }
        public List<ArticuloVenta> GetAllArticuloVenta(int idVenta) {
            List<ArticuloVenta> lista= Context.ArticuloVenta.Where(f=>f.Idventa==idVenta).ToList();
            return lista;
        }
        public bool OrdenYaEmitida(Articulo articulo)
        {
            DetalleOrdenDeCompra doc = Context.DetalleOrdenDeCompra.Where(f => f.IdArticulo == articulo.Id && f.OrdenCompra.Estado=="Generada").FirstOrDefault();
            if (doc == null)
                return true;
            else
                return false;

        }
        
       
    }
}
